#include <iostream>
#include <unordered_map>
using namespace std;
struct node
{
  int id;
  int weight;
  int left_id;
  int right_id;
};
int res = 0;
unordered_map<int, node> node_map; // 两种不同解法都用到了，整棵树都存储于此
void dfs(int id, int cache)
{
  // base case:到叶子节点了
  if (id == -1)
    return;
  node temp = node_map[id]; // 提取此id下的Node
  int left_id = temp.left_id;
  int right_id = temp.right_id;
  cache = cache ^ temp.weight;
  res = res < cache ? cache : res; // 暴力搜索了，总能记录一个最大的
  dfs(left_id, cache);
  dfs(right_id, cache);
}
int main()
{
  int N;
  cin >> N; // N个节点
  for (int i = 0; i < N; i++)
  {
    int id, weight, left, right;
    cin >> id >> weight >> left >> right; // id是本节点的id信息，left与right是左右子树的id信息
    node temp{id, weight, left, right};
    node_map.insert({id, temp});
  }
  // 遍历每一个节点
  // 兄弟，你找根节点就不对了，因为要从每个节点遍历的
  for (auto item : node_map)
    // 先序遍历每一个item=Map<int, Node>
    // 0^a=a, 因此从cache==0开始
    dfs(item.second.id, 0); // item.second为Node

  cout << res << endl;
  return 0;
}